﻿using System.Collections.Generic;
using System.Linq;
using Business_Layer.Data_Access_Layer;

namespace Business_Layer.Business_Layer.Integrantes
{
    public class ControladorIntegrantes
    {
        private readonly DB_SAPDataContext _dbSap = new DB_SAPDataContext();

        private IEnumerable<INTEGRANTES> ObtenerIntegrantesPorProyecto(string proyecto)
        {
            return _dbSap.INTEGRANTES.Where(x => x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto)).ToList();
        }

        private IEnumerable<PROYECTOS> ObtenerProyectos()
        {
            return _dbSap.PROYECTOS.Select(x => x).ToList();
        }

        private IEnumerable<USUARIOS> ObtenerUsuarios()
        {
            return _dbSap.USUARIOS.Select(x => x).ToList();
        }

        private IEnumerable<ROLESPROYECTO> ObtenerRoles()
        {
            return _dbSap.ROLESPROYECTO.Select(x => x).ToList();
        } 

        public string CargarUsuarios()
        {
            var listaUsuarios = ObtenerUsuarios()
                .Aggregate(string.Empty,
                           (current, usuario) =>
                           current + ("<option>" + usuario.USUARIO_nombre +
                                      "</option>"));

            return "<select id='selectUsuarios'>" + listaUsuarios + "</select>";
        }

        public string CargarRoles()
        {
            var listaRoles = ObtenerRoles()
                .Aggregate(string.Empty,
                           (current, rol) =>
                           current + ("<option>" + rol.ROLPROYECTO_nombre +
                                      "</option>"));

            return "<select id='selectRoles'>" + listaRoles + "</select>";
        }

        public string CrearContenidoIntegrantes(string proyecto)
        {
            var renderIntegrantes = ObtenerIntegrantesPorProyecto(proyecto)
                .Aggregate(string.Empty, (current, integrante) => current + (
                                                                                "<tr>" +
                                                                                "<td>" +
                                                                                integrante.USUARIOS.USUARIO_nombre +
                                                                                "</td>" +
                                                                                "<td>" +
                                                                                integrante.ROLESPROYECTO.ROLPROYECTO_nombre +
                                                                                "</td>" +
                                                                                "<td>" +
                                                                                "<span id='btnEditarIntegrante" +
                                                                                "' data-id='" +
                                                                                integrante.INTEGRANTES_ID +
                                                                                "' data-rol='" +
                                                                                integrante.ROLESPROYECTO.ROLPROYECTO_nombre +
                                                                                "'>" +
                                                                                "<img src='/Misc/imagenes/edit_icon_24.png' />" +
                                                                                "</span>" +
                                                                                "<span id='btnEliminarIntegrante' data-id='" +
                                                                                integrante.INTEGRANTES_ID + "'>" +
                                                                                "<img src='/Misc/imagenes/cancel.png' />" +
                                                                                "</span></td>" +
                                                                                "</tr>"));

            return
                "<table id='tblIntegrantes''>" +
                "<tr>" +
                "<th>Usuario</th>" +
                "<th>Rol</th>" +
                "<th></th>" +
                "</tr>" +
                renderIntegrantes +
                "</table>";
        }

        public string CrearDialogoAgregarIntegrante()
        {
            var dialogo =
            "<table>" +
            "<tr>" +
            "<td>Usuario: </td><td>" + CargarUsuarios() + "</td>" +
            "</tr>" +
            "<tr>" +
            "<td>Rol: </td>" +
           "<td>" + CargarRoles() + "</td>" +
            "</tr>" +
            "<tr>" +
            "<td>Proyecto: </td>" +
            "<td>" + CargarProyectos("selectProyectosDialogo") + "</td>" +
            "</tr>" +
            "</table>";

            return dialogo;
        }

        public string CrearDialogoEditarIntegrante()
        {
            var dialogo =
            "<table>" +
            "<tr>" +
            "<td>Rol: </td>" +
           "<td>" + CargarRoles() + "</td>" +
            "</tr>" +
            "</table>";

            return dialogo;
        }

        public string RegistrarIntegrante(INTEGRANTES integrante, string proyecto)
        {
            try
            {
                var mismoUsuarioYRol =
                    _dbSap.INTEGRANTES.Any(
                        x =>
                        x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                        x.INTEGRANTES_USUARIO_ID == integrante.INTEGRANTES_USUARIO_ID && x.INTEGRANTES_ROLPROYECTO_ID == integrante.INTEGRANTES_ROLPROYECTO_ID);

                if (mismoUsuarioYRol)
                    return "Este usuario ya se encuentra activo con ese rol en este proyecto";

                if (integrante.INTEGRANTES_ROLPROYECTO_ID == 1)
                {
                    var rol =
                        _dbSap.INTEGRANTES.Any(
                            x =>
                            x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                            x.INTEGRANTES_ROLPROYECTO_ID == 1);

                    if (rol)
                        return "Ya se encuentra un usuario con el rol de Scrum Master activo";
                }
                else if (integrante.INTEGRANTES_ROLPROYECTO_ID == 4)
                {
                    var rol =
                        _dbSap.INTEGRANTES.Any(
                            x =>
                            x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                            x.INTEGRANTES_ROLPROYECTO_ID == 4);

                    if (rol)
                        return "Ya se encuentra un usuario con el rol de Product Owner activo";
                }

                var proyectoId = _dbSap.PROYECTOS.Single(x => x.PROYECTOS_nombre.Equals(proyecto)).PROYECTOS_ID;

                _dbSap.INTEGRANTES.InsertOnSubmit(integrante);
                _dbSap.SubmitChanges();

                var proyectosIntegrantes = new INTEGRANTES_PROYECTOS
                    {
                        INTEGRANTE_ID = integrante.INTEGRANTES_ID,
                        PROYECTO_ID = proyectoId
                    };

                _dbSap.INTEGRANTES_PROYECTOS.InsertOnSubmit(proyectosIntegrantes);
                _dbSap.SubmitChanges();

                return "Integrante registrado";
            }
            catch
            {
                return "Integrante no registrado";
            }
        }

        public string CargarProyectos(string idSelect)
        {
            var listaProyectos = ObtenerProyectos()
                .Aggregate(string.Empty,
                           (current, proyecto) =>
                           current + ("<option>" + proyecto.PROYECTOS_nombre +
                                      "</option>"));

            return "<select id='" + idSelect + "'>" + listaProyectos + "</select>";
        }

        public string ModificarIntegrante(INTEGRANTES integrante, string proyecto)
        {
            try
            {
                var mismoUsuarioYRol =
                                    _dbSap.INTEGRANTES.Any(
                                        x =>
                                        x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                                        x.INTEGRANTES_USUARIO_ID == integrante.INTEGRANTES_USUARIO_ID && x.INTEGRANTES_ROLPROYECTO_ID == integrante.INTEGRANTES_ROLPROYECTO_ID);

                if (mismoUsuarioYRol)
                    return "Este usuario ya se encuentra activo con ese rol en este proyecto";

                if (integrante.INTEGRANTES_ROLPROYECTO_ID == 1)
                {
                    var rol =
                        _dbSap.INTEGRANTES.Any(
                            x =>
                            x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                            x.INTEGRANTES_ROLPROYECTO_ID == 1);

                    if (rol)
                        return "Ya se encuentra un usuario con el rol de Scrum Master activo";
                }
                else if (integrante.INTEGRANTES_ROLPROYECTO_ID == 4)
                {
                    var rol =
                        _dbSap.INTEGRANTES.Any(
                            x =>
                            x.INTEGRANTES_PROYECTOS.FirstOrDefault().PROYECTOS.PROYECTOS_nombre.Equals(proyecto) &&
                            x.INTEGRANTES_ROLPROYECTO_ID == 4);

                    if (rol)
                        return "Ya se encuentra un usuario con el rol de Product Owner activo";
                }

                var integranteModificar = _dbSap.INTEGRANTES.FirstOrDefault(x => x.INTEGRANTES_ID == integrante.INTEGRANTES_ID);

                if (integranteModificar != null)
                {
                    integranteModificar.INTEGRANTES_ROLPROYECTO_ID = integrante.INTEGRANTES_ROLPROYECTO_ID;

                    _dbSap.SubmitChanges();
                    return "Integrante editado";
                }

                return "Integrante no editado";
            }
            catch
            {
                return "Integrante no editado";
            }
        }

        public string EliminarIntegrante(int id)
        {
            try
            {
                var integrante = _dbSap.INTEGRANTES.Single(x => x.INTEGRANTES_ID == id);
                var integrantePr = _dbSap.INTEGRANTES_PROYECTOS.Single(x => x.INTEGRANTE_ID == id);
                _dbSap.INTEGRANTES_PROYECTOS.DeleteOnSubmit(integrantePr);
                _dbSap.INTEGRANTES.DeleteOnSubmit(integrante);
                _dbSap.SubmitChanges();

                return "Integrante eliminado";
            }
            catch
            {
                return "Integrante no eliminado";
            }
        }
    }
}
